最近在找回荒廢已久的解題技能...QQ 從工作之後就越來越生疏了,尤其進入 tcache 時代就幾乎沒有認真研究過,這幾天都在重新學習 T___T
不過今天的文章還是不會講得太深入就是了,只會大概提一下 CTF 中有哪些 heap 的玩法,如果要了解詳細原理,請直接點參考資料
這是一份由 CTF 隊伍 shellphish 編輯的 heap 教材,上面已經整理了目前已知的 heap 玩法和各種用 C 語言寫的範例,還有統整以前有哪些 CTF 題目考過,最重要的是,還有附註哪些 glibc 版本才適用 XD 對有一陣子沒碰 heap exp 的我真的太有幫助了,但因為缺乏視覺化的關係,對新手其實不好理解,如果是第一次學習的人可能還是要看視覺化的教材會比較容易明白,接下來會盡量以淺顯易懂的方式解釋這些 heap 玩法
上述的六種利用方式一直到目前最新的 glibc 版本都可以利用,利用難度也相對簡單,明天再繼續講剩下的幾種方式 XD
今天要介紹的這題 OREO 可以說是 pwn 題的先驅,當年 pwn 題大家還不流行玩 heap,大家就頂多玩到以前 dlmalloc 的 unlink 造成任意寫入,這題可以說是當年讓大家耳目一新,也開始將 ptmalloc 的玩法出成 CTF 題,像是 phrack 的這份文件:http://phrack.org/issues/66/10.html
這題是 32 bit,保護只有 NX 和 PIE,功能是典型的選單題,功能有六個:
rifles_cnt
的值order_cnt
這個程式上 bss 的結構長這樣:
int order_cnt;
int rifles_cnt;
char *msg_ptr;
char msg_buf[128];
利用 2. 的功能可以輕鬆將 heap 的 address 給印出來,加上 1. 輸入 data 可以覆蓋掉 prev,我們可以用今天文章提到的 House of Spirit,將在 4. 留訊息的功能偽造 fastbin chunk,加入 prev 後 free 掉,然後再一次利用 4. 的功能改寫 fastbin 的 fd,利用 order_cnt
和 rifles_cnt
偽造成 chunk prev_size 和 size,將 fd 改成 &order_cnt 的位置之後,我們就能再 malloc 兩次就能改寫掉 msg_ptr
的值,接下來 4. 和 5. 的功能就變成任意 address 的讀寫了
這題因為沒有給 libc (當年的題目很喜歡不給 libc QQ),後續利用還是有一些麻煩,要 leak linkmap 之後做 ret2dl-resolve 才能 call system
,但以現在 pwn 題的水準來看,簡直是送分題了.....XDD 現在拜 angelboy 所賜,沒有保護全開的 heap 題已經不能拿出來放了,讓我們一起緬懷過去拿個美好而單純的年代 (誤